package src.CodeTop;

/**
 * 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
 *
 * 请你将两个数相加，并以相同形式返回一个表示和的链表。
 *
 * 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 *
 *  
 *
 * 示例 1：
 *
 *
 * 输入：l1 = [2,4,3], l2 = [5,6,4]
 * 输出：[7,0,8]
 * 解释：342 + 465 = 807.
 * 示例 2：
 *
 * 输入：l1 = [0], l2 = [0]
 * 输出：[0]
 * 示例 3：
 *
 * 输入：l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
 * 输出：[8,9,9,9,0,0,0,1]
 *
 */

public class _2AddTwoNumbers {
    public static void main(String[] args) {

    }

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 初始化返回链表的哑结点
        ListNode virNode = new ListNode(0);
        // 定义双链表的遍历指针
        ListNode cur1 = l1, cur2 = l2;
        // 返回链表的遍历指针
        ListNode cur = virNode;
        // 初始化每个结点的值，和，进位值
        int num1 = 0, num2 = 0, sum = 0, carry = 0, realNum = 0;
        // 循环遍历双链表
        while (cur1 != null || cur2 != null) {
            // 先取出两链表当前结点上的值
            num1 = (cur1 == null) ? 0 : cur1.val;
            num2 = (cur2 == null) ? 0 : cur2.val;
            // 再计算总和
            sum = num1 + num2 + carry;
            // 计算进位值
            carry = sum / 10;
            // 当前位置上真正的值
            realNum = sum % 10;
            // 生成这个新值并连接到返回链表上
            cur.next = new ListNode(realNum);
            // 新链表指针后移
            cur = cur.next;
            // 两指针后移，注意此处是判断当前指针是否为空
            if (cur1 != null) {
                cur1 = cur1.next;
            }
            if (cur2 != null) {
                cur2 = cur2.next;
            }
        }
        //如果最后一次相加大于10 也即进位值为1
        if (carry > 0) {
            cur.next = new ListNode(carry);
        }
        return virNode.next;
    }
}
